//
//  UserAccountViewModel.swift
//  Weibo10
//
//  Created by mac on 16/8/14.
//  Copyright © 2016年 itheima. All rights reserved.
//

import Foundation

// 没有父类的继承，减少了许多的负担，更轻量级别，没有复杂的属性

class UserAccountViewModel {
    
    // 创建单例避免重复下载
    static let sharedUserAccount = UserAccountViewModel()
    
    // 用户模型
    var account: UserAccount?
    
    // 用户登录登记
    var userLogon: Bool {
        //1. 如果 token 有值，说明登录成功
        return account?.access_token != nil && !isExpired
        
    }
    
    // 返回有效的 token
    var accesssToken: String? {
        
        // 如果没有过期返回account模型中的 token属性
        if !isExpired {
            return account?.access_token
        }
        return nil
    }
    
    // 判断账户是否过期
    private var isExpired: Bool {
        
        // 如果过期
        if account?.expiresDate?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
            
            return false
        }
        
        // 没有过期
        return true
    }
    
    // 用户头像 URL
    var avatarUrl: NSURL {
        return NSURL(string: account?.avatar_large ?? "")!
    }
    
    // 归档的路径
    private var accountPath: String {
    
        // 归档路径
    let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!
        
        // 拼接文件
    return (path as NSString).stringByAppendingPathComponent("account.plist")
    
    }
    
    
    
    // 构造函数
   private init() {
        
        // 从沙盒解当数据，恢复当前数据
        account = NSKeyedUnarchiver.unarchiveObjectWithFile(accountPath) as?UserAccount
        
        // 判断token是否过期
        if isExpired {
            print("已经过期")
            
            // 如果过期，清空解当的数据
            account = nil
        }
    }
 
}

// MARK: - 减负控制器
// 网络
extension UserAccountViewModel {
    
    // 加载 token
    func loadAccessToken(code: String, finished:(isSuccessed: Bool) -> ()) {
        
        // 加载网络数据
        NetworkTools.sharedTools.loadAccessToken(code) { (result, error) -> () in
            
            // 判断错误
            if error != nil {
                
                print("出错了")
                finished(isSuccessed: false)
                return
            }
            
            // 保存到当前的账户中
            self.account = UserAccount(dict: result as![String: AnyObject])
            
    
            self.loadUserInfo(self.account!, finished:finished)
        }
    }
    
    
    // 加载用户信息
      private func loadUserInfo(account: UserAccount, finished: (isSuccessed: Bool) ->()) {
        
        NetworkTools.sharedTools.loadUserInfo(account.uid!) { (result, error) -> () in
            
            // 判断登录是否有错
            if error != nil {
                print("加载用户信息")
                
                // 执行闭包，登录失败
                finished(isSuccessed: false)
                // 然后返回
                return
            }
            
            // 判断返回格式是否正常
            guard let dict = result as? [String: AnyObject] else {
                
                print("格式错误")
                finished(isSuccessed: false)
                return
            }
            
            // 保存用户信息
            account.screen_name = dict["screen_name"] as? String
            account.avatar_large = dict["avatar_large"] as? String
            
            // 模型对象保存，归档
            NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)
            
            
            // 执行闭包，完成加载
            finished(isSuccessed: true)
        }
    }
}
